/**
  ******************************************************************************
  * @文件     lcd.h
  * @作者     hero_cao
  * @版本     V1.0.0
  * @日期     2018/08/14
  * @概要     tftlcd驱动库
  ******************************************************************************
  */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __TFTLCD_H_
#define __TFTLCD_H_

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>	


#define USE_XMC_LCD
#define DATA_BIT	8
 
/* Exported types ------------------------------------------------------------*/
typedef struct  
{										    
	uint16_t	width;		//LCD 宽度
	uint16_t	height;		//LCD 高度
	uint16_t	id;			//LCD id
	uint8_t		dir;		//横屏还是竖屏控制：0，竖屏；1，横屏。	
	uint16_t	wramcmd;	//开始写gram指令
	uint16_t	setxcmd;	//设置x坐标指令
	uint16_t	setycmd;	//设置y坐标指令 
} _lcd_dev; 	  

extern _lcd_dev  lcddev;			/* 管理LCD重要参数 */
extern uint32_t  g_point_color;     /* 默认红色 */
extern uint32_t  g_back_color;      /* 背景颜色.默认为白色 */

typedef struct
{
#if DATA_BIT==16
	volatile uint16_t LCD_REG;
    volatile uint16_t LCD_RAM;
#else
	volatile uint8_t LCD_REG;
    volatile uint8_t LCD_RAM;
#endif
} lcd_typedef;

/* Exported constants --------------------------------------------------------*/
#define L2R_U2D		0	//从左到右,从上到下
#define L2R_D2U		1	//从左到右,从下到上
#define R2L_U2D		2	//从右到左,从上到下
#define R2L_D2U		3	//从右到左,从下到上

#define U2D_L2R		4	//从上到下,从左到右
#define U2D_R2L		5	//从上到下,从右到左
#define D2U_L2R		6	//从下到上,从左到右
#define D2U_R2L		7	//从下到上,从右到左	 

/* 常用画笔颜色 */
#define WHITE           0xFFFF      /* 白色 */
#define BLACK           0x0000      /* 黑色 */
#define RED             0xF800      /* 红色 */
#define GREEN           0x07E0      /* 绿色 */
#define BLUE            0x001F      /* 蓝色 */ 
#define MAGENTA         0XF81F      /* 品红色/紫红色 = BLUE + RED */
#define YELLOW          0XFFE0      /* 黄色 = GREEN + RED */
#define CYAN            0X07FF      /* 青色 = GREEN + BLUE */  

/* 非常用颜色 */
#define BROWN           0XBC40      /* 棕色 */
#define BRRED           0XFC07      /* 棕红色 */
#define GRAY            0X8430      /* 灰色 */ 
#define DARKBLUE        0X01CF      /* 深蓝色 */
#define LIGHTBLUE       0X7D7C      /* 浅蓝色 */ 
#define GRAYBLUE        0X5458      /* 灰蓝色 */ 
#define LIGHTGREEN      0X841F      /* 浅绿色 */  
#define LGRAY           0XC618      /* 浅灰色(PANNEL),窗体背景色 */ 
#define LGRAYBLUE       0XA651      /* 浅灰蓝色(中间层颜色) */ 
#define LBBLUE          0X2B12      /* 浅棕蓝色(选择条目的反色) */ 

/* Exported macro ------------------------------------------------------------*/
/* (片选脚FSMC_NEx)x=1/2/3/4, (RS接地址线FSMC_Ay)y=0-25 16位数据线要左移一位对其 */
/* LCD_BASE = (0x6000 0000 + (0x400 0000 * (x - 1))) | ((1 << y) * y/8 - y/8) */			    
#define LCD_BASE	((uint32_t)(0x60000000 | ((1 << 16) * DATA_BIT/8 - DATA_BIT/8)))
#define LCD			((lcd_typedef *) LCD_BASE)

/* Exported functions ------------------------------------------------------- */
void lcd_init(void);
void lcd_clear(uint16_t color);
void lcd_write_ram_prepare(void);
void lcd_write_color(uint16_t rgb_code);
void lcd_set_cursor(uint16_t x, uint16_t y, uint16_t dx, uint16_t dy);
void lcd_draw_point(uint16_t x, uint16_t y, uint32_t color);
uint32_t lcd_read_point(uint16_t x, uint16_t y);
void lcd_scan_dir(uint8_t dir);
void lcd_display_dir(uint8_t dir);
void lcd_set_window(uint16_t sx, uint16_t sy, uint16_t width, uint16_t height);
void lcd_fill_circle(uint16_t x, uint16_t y, uint16_t r, uint16_t color);                   /* 填充实心圆 */
void lcd_draw_circle(uint16_t x0, uint16_t y0, uint8_t r, uint16_t color);                  /* 画圆 */
void lcd_draw_hline(uint16_t x, uint16_t y, uint16_t len, uint16_t color);                  /* 画水平线 */
void lcd_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint32_t color);          /* 纯色填充矩形(32位颜色,兼容LTDC) */
void lcd_color_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t *color);   /* 彩色填充矩形 */
void lcd_draw_line(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color);     /* 画直线 */
void lcd_draw_rectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color);/* 画矩形 */
void image_show(uint8_t *p, uint16_t xsta, uint16_t ysta, uint16_t width, uint16_t height);	/* 显示图片 */
void lcd_show_char(uint16_t x, uint16_t y, char chr, uint8_t size, uint8_t mode, uint16_t color);                       /* 显示一个字符 */
void lcd_show_num(uint16_t x, uint16_t y, uint32_t num, uint8_t len, uint8_t size, uint16_t color);                     /* 显示数字 */
void lcd_show_xnum(uint16_t x, uint16_t y, uint32_t num, uint8_t len, uint8_t size, uint8_t mode, uint16_t color);      /* 扩展显示数字 */
void lcd_show_string(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t size, char *p, uint16_t color);   /* 显示字符串 */


#endif  /* __TFTLCD_H_ */
